<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>var</title>
</head>
<body>
<script>
    //所有使用var声明的变量，都会被变量提升
    console.log("此时a没有被定义->undefined", a)
    var a = 1
    console.log(a)

    //function 不仅变量会提升，函数声明也会提升。而且优先级比var更高

    console.log("function()=>", b)
    var b = 12

    function b() {

    }

    //由于函数声明也提升了【移到上面去了】，所以上面就是var b=12（输出12）
    console.log("输出12->", b)


    //es5规范不允许在块级作用域声明函数，只允许在顶层作用域声明变量
    //但是浏览器没有采纳这个建议（因为很多老代码违反了es5这个规定）
    //在es5浏览器中，function声明的函数，变量和声明同时提升到函数作用域/顶层作用域顶部

    function foo(a) {
        console.log(a)

        //function在es5浏览器中变量（声明）均提升到顶层作用域，或者函数作用域顶部
        function a() {

        }

        var a = 12
        console.log(a)
    }

    var a = 10
    foo(a)

    //es6规范中允许在块级作用域声明函数，但是函数变量提升和声明提升范围不同
    //使用function声明的函数，其声明只能提升到块级作用域的顶部
    //使用function声明的函数，其变量可以提升到函数作用域或顶层作用域的顶部

    function f() {
        console.log("我是外部的函数")
    }

    (function () {
        if(false){
            function f(){
                console.log("我是来自内部的函数")
            }
        }
        //f() 这代码在不严谨的es5中不会报错，会执行内部的函数
        //但是在es6中变量和函数的声明分别提升，所以回报错：f is not function
    })()
</script>
</body>
</html>